/*
 *  Copyright (C) 2010 Glauco
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.balisunrise.builder;

import org.balisunrise.common.Basic;
import org.balisunrise.common.BindingGroup;
import org.balisunrise.common.ComponentManager;

/**
 * Factory de Bindings e BindingGroup.
 *
 * @author Glauco
 */
public interface BindingBuilder<B> {

    /**
     * Cria grupo de Binding {@link org.balisunrise.common.BindingGroup}
     *
     * @return nova instância de BindingGroup.
     */
    public BindingGroup<B> createBindingGroup();

    /**
     * Cria um novo Binding a partir de um Source e um Target e suas 
     * propriedades que devem ser vinculadas.
     * 
     * @param bindingGroup Grupo de Binding que receberá o Binding criado.
     * @param source Objeto Source.
     * @param sourceProperty Nome da Propriedade de Source.
     * @param target Objeto Target.
     * @param targetProperty Nome da Propriedade de Target.
     * @return A instância do Binding criado e adicionado ao BindingGroup.
     */
    public B createBinding(BindingGroup bindingGroup,
            Object source, String sourceProperty,
            Object target, String targetProperty);

    /**
     * Cria um novo Binding a partir de um Source e um Target e suas
     * propriedades que devem ser vinculadas, e um ComponentManager para
     * ler e escrever os dados no Target.
     * Este tipo de Binding assume que o Target é um componente de representação
     * visual.
     *
     * @param bindingGroup Grupo de Binding que receberá o Binding criado.
     * @param source Objeto Source.
     * @param sourceProperty Nome da Propriedade de Source.
     * @param target Objeto Target.
     * @param targetProperty Nome da Propriedade de Target.
     * @param componentManager Controle para leitura e escrita dos dados do
     * Target.
     * @param nullForEmpty Instrução de leitura do ComponentManager.
     * @return A instância do Binding criado e adicionado ao BindingGroup.
     */
    public B createBinding(BindingGroup bindingGroup,
            Object source, String sourceProperty,
            Object target, String targetProperty,
            ComponentManager componentManager,
            boolean nullForEmpty);

    /**
     * Cria um novo Binding a partir de um Source e um Target e suas
     * propriedades que devem ser vinculadas, e um ComponentManager para
     * ler e escrever os dados no Target.
     * Este tipo de Binding assume que o Target é um componente de representação
     * visual, e que existe um Basic owner do componente visual.
     *
     *
     * @param bindingGroup Grupo de Binding que receberá o Binding criado.
     * @param source Objeto Source.
     * @param sourceProperty Nome da Propriedade de Source.
     * @param target Objeto Target.
     * @param targetProperty Nome da Propriedade de Target.
     * @param componentManager Controle para leitura e escrita dos dados do
     * Target.
     * @param nullForEmpty Instrução de leitura do ComponentManager.
     * @param owner Basic proprietário da representação visual (Target).
     * @return  A instância do Binding criado e adicionado ao BindingGroup.
     */
    public B createBinding(BindingGroup bindingGroup,
            Object source, String sourceProperty,
            Object target, String targetProperty,
            ComponentManager componentManager,
            boolean nullForEmpty, Basic owner);
}
